<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    
  </style>
</head>
<body>
  
</body>
<script>

  
  // 【基础规则】：函数执行完毕后，会删除内部所有的数据
  // 每次函数执行都是独立的
  // 每次函数执行内创建的数据，在下次执行时无法获取到
  // 可以认为，函数只要执行结束，其内部所有的数据都会被删除
  
  function fun(){
    let a = 10;
    a++;
    console.log(a);
  }
  fun();
  fun();
  fun();
  fun();


  // 在box内返回的新函数中，没有创建自己的数据，在使用外层数据，外层数据和新函数自身同处于一个作用域中，所以可以重复使用当前作用域中的数据
  // 【结论】：函数在执行时，可以使用自身定义作用域内的数据

  function box(){
    let a = 10;
    return function(){
      a++;
      console.log(a);
    }
  };

  let fn = box();
  fn();
  fn();
  fn();
  fn();


  // 在内存中，每个函数会占用两个空间

  // 函数定义时，作用域空间
  // 函数执行时，执行空间

  // 执行空间在每次执行结束后都会被释放
  // 函数每次执行时都会重新创建一个执行空间

  // 如果让函数的某次执行产生的执行空间不释放，可以在下次执行时获取上次执行产生的数据
  // 如何产生一个不会释放的执行空间：在执行空间外，有一个引用指向了执行空间内的数据
  // 只要产生了一个不会被释放的执行空间，那么该执行空间内的数据，就可以被重复使用



  // 沙箱模式的闭包

  function foo(){
    let name = "admin";
    let age = 18;
    return {
      get name(){
        return name;
      },
      set name(v){
        name = v
      },
      get age(){
        return age;
      },
      set age(val){
        age = val
      }
    }
  }

  const obj = foo();

  obj.name = "root"

  console.log(obj.name);
  
  console.log(obj.age);
  obj.age = 30;
  console.log(obj.age);







  
</script>
</html>